import router from '@/router'
import store from '@/store'
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式
// import { asyncRoutes } from '@/router/index'

const whiteList = ['/login', '404']
// 路由前置守卫添加用户权限
// to:去哪里
// from:从哪里来
// next:next()放行 next(false)不放行 next('地址')放行且去对应的地址  next({path:地址})
router.beforeEach(async(to, from, next) => {
  // 开启进度条
  NProgress.start()
  const token = store.getters.token
  if (token) {
    if (to.path === '/login') {
      next('/')
      NProgress.done()
    } else {
      if (!store.state.user.userInfo.userId) {
        const res = await store.dispatch('user/getUserInfo')
        // res.roles.menus 获取这个对象里当对应的动态路由数据
        const otherRoutes = await store.dispatch('permission/filterRoutes', res.roles.menus)
        // otherRoutes 获取过滤后的路由数据
        // router.addRoutes(asyncRoutes) // addRoutes路由方法可以改变路由规则 动态添加路由是异步的
        router.addRoutes([...otherRoutes, { path: '*', redirect: '/404', hidden: true }])
        // 主要用于解决异步的addRoutes方法
        next({
          ...to,
          replace: true // 重进一次, 解决异步的问题 固定写法
        })
      }
      next()
    }
  } else {
    // includes 数组的方法 包含
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
      NProgress.done()
    }
  }
})

// 后置守卫
router.afterEach((to, from) => {
  setTimeout(function() {
    // 关闭进度条
    NProgress.done()
  }, 800)
})
